package com.my.zl.common.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.my.zl.common.dto.advancedQuery.PageQueryDTO;

import net.logstash.logback.encoder.org.apache.commons.lang.StringUtils;

public class PageUtil {
    
    protected static final int DEFAULT_PAGE_NO = 1;//默认页码
    protected static final int DEFAULT_MAX_NUM = 10;//默认条数
    protected static final int MAX_PAGE_SIZE = 1000;//最大值(MAX_PAGE_SIZE*MAX_PAGE_NO),再往后也没意义了，肯定要特殊处理
    protected static final int MAX_PAGE_NO = 100;//最大值(MAX_PAGE_SIZE*MAX_PAGE_NO),再往后也没意义了，肯定要特殊处理
    
    // 字段名过滤,只有字母+数字才正确
    private static final Pattern FIELD_FILTER_RULE1 = Pattern.compile("[^a-zA-Z0-9_]");
    
    /** 
     * 处理分页属性、校验正确性
     */
    public static void pageHandle(PageQueryDTO page,Boolean limitFlag) {
        //限制一下单页最大条数，和可看总条数
        if(limitFlag){
            if(page.getPage() > MAX_PAGE_NO || page.getPage() * page.getLimit() > MAX_PAGE_NO * MAX_PAGE_SIZE){
                page.setPage(DEFAULT_PAGE_NO);
                page.setLimit(DEFAULT_MAX_NUM);
            }
        }
        //处理排序字段
        if(StringUtils.isNotBlank(page.getSort())){//排序字段
            List<String> orderList = new ArrayList<>();
            
            page.setSort(page.getSort().replace("\\s",""));
            String sortarr[] = page.getSort().split(",");
            
            if(StringUtils.isNotBlank(page.getOrder())){//排序方式
                page.setOrder(page.getOrder().replace("\\s",""));
                
                String orderarr[] = page.getOrder().split(",");
                
                for(int i=0,ln = sortarr.length; i<ln; i++){
                    String sorti = sortarr[i];
                    String orderi = "";
                    if(i < orderarr.length){
                        orderi = orderarr[i];
                    }
                    Matcher nameMH1 = FIELD_FILTER_RULE1.matcher(sorti);
                    if (nameMH1.find()) {//不符合规则
                        continue;
                    }
                    
                    if (!orderi.equalsIgnoreCase("ASC")&&!orderi.equalsIgnoreCase("DESC")) {//不符合规则
                        orderi ="";
                    }
                    if(StringUtils.isNotBlank(sorti)){
                        orderList.add(sorti+" "+orderi);
                    }
                }
            }else{
                for(int i=0,ln = sortarr.length; i<ln; i++){
                    String sorti = sortarr[i];
                    
                    Matcher nameMH1 = FIELD_FILTER_RULE1.matcher(sorti);
                    if (nameMH1.find()) {//不符合规则
                        continue;
                    }
                    if(StringUtils.isNotBlank(sorti)){
                        orderList.add(sorti);
                    }
                }
            }
            
            if(orderList.size()>0){
                page.setSortorder(StringUtils.join(orderList, ","));
            }else{
                page.setSortorder(null);
            }
        }else{
            page.setSortorder(null);
        }
    }
    
    /** 
     * 处理分页属性、校验正确性
     * 限制单页数量、可看总数
     */
    public static void pageHandle(PageQueryDTO page) {
        pageHandle(page,true);
    }
}
